home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
game
/
think
/
AmiChess.lha
/
AmiChess
/
src
/
util.c
< prev
Wrap
C/C++ Source or Header
|
2002-10-31
|
3KB
|
115 lines
#include <string.h>
#include <signal.h>
#include "common.h"
#ifdef NO_INLINE
unsigned char leadz(BitBoard b)
{
if(b>>48) return lzArray[b>>48];
if(b>>32) return lzArray[b>>32]+16;
if(b>>16) return lzArray[b>>16]+32;
return lzArray[b]+48;
}
unsigned char nbits(BitBoard b)
{
return BitCount[b>>48]+BitCount[(b>>32)&0xffff]+BitCount[(b>>16)&0xffff]+BitCount[b&0xffff];
}
#endif
void UpdateFriends()
{
BitBoard *w,*b;
w=board.b[white];
b=board.b[black];
board.friends[white]=w[pawn]|w[knight]|w[bishop]|w[rook]|w[queen]|w[king];
board.friends[black]=b[pawn]|b[knight]|b[bishop]|b[rook]|b[queen]|b[king];
board.blocker=board.friends[white]|board.friends[black];
}
void UpdateCBoard()
{
BitBoard b;
short piece,sq;
memset(cboard,0,sizeof(cboard));
for(piece=pawn;piece<=king;piece++)
{
b=board.b[white][piece]|board.b[black][piece];
while(b)
{
sq=leadz(b);
CLEARBIT(b,sq);
cboard[sq]=piece;
}
}
}
static const short OrigCboard[64]=
{
rook,knight,bishop,queen,king,bishop,knight,rook,
pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
empty,empty,empty,empty,empty,empty,empty,empty,
pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
rook,knight,bishop,queen,king,bishop,knight,rook
};
void UpdateMvboard()
{
short sq;
for(sq=0;sq<64;sq++)
{
if(cboard[sq]==empty||cboard[sq]==OrigCboard[sq]) Mvboard[sq]=0;
else Mvboard[sq]=1;
}
}
void EndSearch(int dummy)
{
SET(flags,TIMEOUT);
signal(SIGINT,EndSearch);
}
short ValidateBoard()
{
short side,xside,sq;
if(nbits(board.b[white][king])!=1) return false;
if(nbits(board.b[black][king])!=1) return false;
side=board.side;
xside=1^side;
if(SqAtakd(board.king[xside],side)) return false;
if(board.ep>-1)
{
sq=board.ep+(xside==white?8:-8);
if(!(BitPosArray[sq]&board.b[xside][pawn]))
return false;
}
if(board.flag&WKINGCASTLE)
{
if(!(BitPosArray[E1]&board.b[white][king])) return false;
if(!(BitPosArray[H1]&board.b[white][rook])) return false;
}
if(board.flag&WQUEENCASTLE)
{
if(!(BitPosArray[E1]&board.b[white][king])) return false;
if(!(BitPosArray[A1]&board.b[white][rook])) return false;
}
if(board.flag&BKINGCASTLE)
{
if(!(BitPosArray[E8]&board.b[black][king])) return false;
if(!(BitPosArray[H8]&board.b[black][rook])) return false;
}
if(board.flag&BQUEENCASTLE)
{
if(!(BitPosArray[E8]&board.b[black][king])) return false;
if(!(BitPosArray[A8]&board.b[black][rook])) return false;
}
return true;
}